无主题

Android中ListView的垃圾回收 - 王胜

ListView中ItemView的复用

为了提高ListView的加载速度和用户操作的流畅度,ListView底层做了ItemView的复用,避免重复地为每一个ItemView开辟空间。

  • ActiveView

    激活view,当期显示在屏幕上的激活的view

  • ScrapView
    废弃view,被删除的ActiveView会被自动加入ScrapView

ListView的ItemView中大图片的覆盖显示

由于复用机制,当Item中包含大图时,由于Java GC的回收机制不够及时,造成ScrapView中图片资源不能立即释放,当用户上拉加载新的item内容时,却看到了之前加载的图片,直到新图从网络下载完毕,才会刷新view正确显示图片。

考虑到这种情况,Android 在API Level1中已经为ListView和GridView添加了RecyclerListener回调接口。开发者只需为ListView注册回调,重写onMovedToScrapHeap方法即可。

示例:

1
2
3
4
5
6
7
8
mListView.setRecyclerListener(new RecyclerListener() {
@Override
public void onMovedToScrapHeap(View view) {
// Release strong reference when a view is recycled
final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon);
imageView.setImageBitmap(null);
}
});

参考资料:

提升用户体验的7大微交互 - 张超耀


众所周知,我们总是依据封面来判断书的好坏,聪明的设计师会创造实用有吸引力的界面。潜在用户可能会被吸引,但如何一直黏住他们呢?

要试着回答这个问题,所有一切都指向人本设计,其中用户是最主要的考量。以人为本:你的应用应该使用日常用语,包括情绪、口语,外观还要有一丝“诱惑力”。界面应当成为你的好朋友,时刻准备给出建议提升你的体验,让你会心一笑。

  • 是微交互在起作用。精确的说,这主要是界面附带的交互动画,使它更具表现力。优秀的动画能够:

    • 表达状态并提供反馈
    • 提升直接的操纵感
    • 将操作结果可视化
  • 在用户体验中,关键是你如何对待用户,还有他们使用产品时的感受。极小的细节都值得加倍留心。微交互提供了用户所需的反馈,表达了当前运行状况。无论背后逻辑有多么复杂,都能使界面更亲切。

显示系统状态

Jakob Nielsen在可用性原则启示第一条中描述:让用户始终知晓当前在发生什么。用户希望立马得到回应,但总有些情况下,网站需要一点时间等待操作完成。

那么,界面就应当在背景处显示图形,反映完成百分比。或是播放声音,让用户了解当前发生的事情。这个原则也关系到文件传输:不要让用户觉得无聊,给他们看进度条。即使是不太令人愉快的通知,比如传输失败,也应该以令人喜爱的方式展现。让你的用户微笑!

突出显示变化

通常为了节省空间,应用会在需要时把某个按钮替换掉。有时我们需要展现通知,确保用户注意到了。动画可以吸引他们注意,不至于忽略你认为重要的信息。


保持前后关联

在这个智能手机和小屏幕智能手表的时代,难以在屏幕上展现大量信息。有一种处理方式,是在不同页面之间保持清晰的导航。让用户理解什么东西来自何处,便能轻易回溯。有多种方式可以实现:

非标准布局

继续之前的例子,微交互应当帮助用户理解如何操作非标准的布局,去除不必要的疑惑。照片前后滑动、滚动式图表和旋转角色都是很棒的选择:


行动号召

除了帮助用户有效地操作应用,微交互也有鼓励用户操作的能力:持续浏览、点赞或分享内容,只因为这很有吸引力,用户不舍离去:


输入的视觉化

所有应用中,数据录入都是最重要的元素之一。数据录入决定了用户所得结果的质量。通常,这部分很无趣,但微交互可以使它与众不同:


使教程生动形象

当然,在应用发布后,动画可以教育用户。它突出一些基本功能和控件,排除用户在未来的使用中的障碍。


结论

所以,如果你重视用户体验,就应该从头到尾精细打磨界面,通过微交互与动画为它增色添彩。它会为你的项目赋予生命。

注意每个细节,是使人机交互易用的成功要诀

原文链接

曾铭

CLI 上手

CLI vs GUI

  • Command Line Interface VS Graphical User Interface
  • 分别是给工程师用的和给人(包含工程师)用的
  • 哪个方便用哪个,哪个好玩用哪个

CLI 能干什么?(for me)

  • 快速安装软件
  • CLI 开发:工具、服务,如 jenkins, sonar, ssh-key,

CLI 如何上手

  • 不要畏惧,把命令行当做大一上的 C 语言,是最简单,逻辑最清晰的。(鬼知道 GUI 背后都做了什么)
  • 理解环境变量 profile_load_path env echo,知道 shell 怎么去找一个命令即可
  • 安装软件,了解常见的包管理工具即可:homebrew(常用软件), gem(ruby 软件), npm (node.js 软件)
    • 基本都是 search install list ,会这三个参数就行了
    • 思想都是想通的,比如 pod (for iOS/OSX dev)
1
2
3
4
5
# 在终端输入试试
say "hi"
# 还有王胜推荐的 sl
brew install sl
sl

Sonar 学习

  • Sonar不叫Sonar 叫SonarQube
  • 开源的 刁刁的 项目地址
  • 管理平台代码质量
  • 支持plugin

    • 通过插件形式,可以支持包括 java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测
    • 插件库
    • 大部分免费 OC不免费 有第三方免费的
  • Sonar的3个组成部分

    • Database (支持多种类型的数据库MySQL/Oracle) 配置sonar实例 存储分析结果
    • Web Server 浏览代码质量分析结果
    • Analyzers 分析代码的分析器
  • Sonar Notes

    • SonarQube的web server和database只能有一个
    • 从性能上考虑 三个组件应该放在三个专有的电脑上,但是Database和Web Server可以安装在同一台电脑上
    • Datatbase和Analyzers不应该安装在同一台电脑上
    • Analyzers可以通过加电脑扩展
    • Database和Analyzers必须存在同一个网络内
    • 所有的机子必须时间同步
  • Analyzers

    • SonarQube Runner: recommended for all non-Maven projects
    • Maven: recommended for all projects built with Maven
    • SonarQube Ant Task: to integrate with projects built with Ant
    • Gradle: to integrate with projects built with Gradle
    • CI Engine: see Jenkins plugin or Hudson plugin or Bamboo plugin or AnthillPro plugin. Note that other CI engines can be used even if there is no SonarQube plugin available.
  • Mac下跑通sonar所有流程需要的东西

    • a Mac with Xcode
    • SonarQube
    • SonarQube Runner
    • xctool
      • xctool是facebook开源的一个命令行工具,用来替代苹果的xcodebuild工具
    • OCLint
      • OCLint是一个静态代码分析器,可以检测的Objective-C代码(同时支持Ç和c + +),发现常见的问题:例如的if / else / try / catch和/最后声明出错,未被使用的本地实例和参数,过度复杂(有效值代码行数状语从句:常循环复杂度太高),冗余代码,代码异味,以及其他不好的代码。
    • gcovr
      • 代码覆盖率分析工具

常用配置文件

配置Sonar-Runner

  • 路径 <放置sonar的目录>/sonar-runner/2.4/libexec/conf/sonar-runner.properties

  • 只摘录相关项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #----- Default SonarQube server 
    sonar.host.url=http://localhost:9000

    #----- MySQL
    sonar.jdbc.url=jdbc:mysql://192.168.22.22:3306/sonar?useUnicode=true&amp;characterEncoding=utf8

    #----- Global database settings
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar

    #----- Security (when 'sonar.forceAuthentication' is set to 'true')
    sonar.login=admin
    sonar.password=admin

配置Database和web server

sonar.properties

  • 路径 <放置sonarqube的目录>/sonarqube-5.1.2/conf/sonar.properties
  • 只摘录相关项
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sonar.jdbc.username=sonar  // 数据库账号
    sonar.jdbc.password=sonar // 数据库密码

    sonar.jdbc.url=jdbc:mysql://192.168.22.22:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    // MySql路径

    sonar.web.host=0.0.0.0 // web host
    sonar.web.context=/sonar // web 路径
    sonar.web.port=9000 // 端口号

配置需要分析的项目 (需放置在项目根目录下)

run-sonar.sh 分析项目的脚本

  • 未做修改 直接拿来用

sonar-project.properties 项目的必要参数
只摘录相关项
看注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

##########################
# Required configuration #
##########################

sonar.projectKey=51offer
sonar.projectName=51offer
sonar.projectVersion=1.9
sonar.language=objc

# Project description
sonar.projectDescription=test

# Path to source directories
sonar.sources=51offer
# Path to test directories (comment if no test)
sonar.tests=51offerTests


# Xcode project configuration (.xcodeproj or .xcworkspace)
# -> If you have a project: configure only sonar.objectivec.project
# -> If you have a workspace: configure sonar.objectivec.workspace and sonar.objectivec.project
# and use the later to specify which project(s) to include in the analysis (comma separated list)
sonar.objectivec.project=51offer.xcodeproj
sonar.objectivec.workspace=51offer.xcworkspace

# Scheme to build your application
sonar.objectivec.appScheme=51offer
# Scheme to build and run your tests (comment following line of you don't have any tests)
# sonar.objectivec.testScheme=myApplicationTests

##########################
# Optional configuration #
##########################

# Encoding of the source code
sonar.sourceEncoding=UTF-8

# JUnit report generated by run-sonar.sh is stored in sonar-reports/TEST-report.xml
# Change it only if you generate the file on your own
# The XML files have to be prefixed by TEST- otherwise they are not processed
# sonar.junit.reportsPath=sonar-reports/

# Cobertura report generated by run-sonar.sh is stored in sonar-reports/coverage.xml
# Change it only if you generate the file on your own
# sonar.objectivec.coverage.reportPattern=sonar-reports/coverage*.xml

# OCLint report generated by run-sonar.sh is stored in sonar-reports/oclint.xml
# Change it only if you generate the file on your own
# sonar.objectivec.oclint.report=sonar-reports/oclint.xml

# Paths to exclude from coverage report (tests, 3rd party libraries etc.)
# sonar.objectivec.excludedPathsFromCoverage=pattern1,pattern2
sonar.objectivec.excludedPathsFromCoverage=.*Tests.*

# Project SCM settings
# sonar.scm.enabled=true
# sonar.scm.url=scm:git:https://...

参考资料: